package ar.com.uade.administradorsiembra.persistencia;

import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import ar.com.uade.administradorsiembra.common.ContextoTransaccional;
import ar.com.uade.administradorsiembra.modelo.Cereal;
import ar.com.uade.administradorsiembra.modelo.ItemSiembra;
import ar.com.uade.administradorsiembra.modelo.Siembra;
import ar.com.uade.administradorsiembra.modelo.exceptions.TransaccionException;

public class SiembraMapper extends Mapper<Siembra> {
	
	private ItemSiembraMapper itemSiembraMapper;
	private CerealMapper cerealMapper;
	
	public SiembraMapper() {
		this.itemSiembraMapper = new ItemSiembraMapper();
		this.cerealMapper = new CerealMapper();
	}
	public Siembra buscar(Cereal cerealASembrar, Date fechaDesde, Date fechaHasta) {
		// TODO Auto-generated method stub
		// SELECT  id, idCereal, fechaDesde, fechaHasta, cantidadSembrada FROM  Siembra 
		return null;
	}

	@Override
	public boolean guardar(Siembra instancia) {
		
		int resultado = 0;
		this.logger.info("Guardando el siguiente Siembra: " + instancia);
		
		if(instancia.getId() == null){
			ContextoTransaccional contexto = null;
			
			try {
				contexto = super.administradorTransaccional.crearContexto(true);			
				
				String query = "INSERT INTO Siembra (idCereal, fechaDesde, fechaHasta, cantidadSembrada )VALUES (?,?,?,?)";		
				List<Object> parametros = new ArrayList<Object>();
				
				parametros.add(instancia.getCereal().getId());
				parametros.add(new Date(instancia.getFechaDesde().getTime()));
				parametros.add(new Date(instancia.getFechaHasta().getTime()));
				parametros.add(instancia.getCantidadSembrada());
				
				try {
					resultado = this.executeUpdate(query, parametros, contexto.getConexionActual());
					
					List<ItemSiembra> siembras = instancia.getDistribucionSiembra();
					for (ItemSiembra itemSiembra : siembras) {
						
						this.itemSiembraMapper.guardar(itemSiembra, obtenerUltimoId());
					}
					this.logger.info("Se guardo el cosecha en forma exitosa.");
					
					
				} catch (SQLException e) {
					this.logger.error("Error al guardar el cosecha. " + e.getMessage());
				}
			} catch (TransaccionException te) {
				this.logger.error("Error al guardar el cosecha. " + te.getMessage());
			} finally {
				contexto.liberarConexion();
			}
			
			return resultado > 0;
		}
		else{
			return this.modificar(instancia);
		}
	}

	@Override
	public Siembra buscarPorId(Integer id) {
		
		this.logger.info("Buscando siembra por id: " + id);
		
		Siembra siembra = null;
		ContextoTransaccional contexto = null;
		
		try {
			contexto = super.administradorTransaccional.crearContexto(true);		
			
			String query = "SELECT  id, idCereal, fechaDesde, fechaHasta, cantidadSembrada FROM  Siembra where id = ?";
			List<Object> parametros = new ArrayList<Object>();
			
			parametros.add(id);
			
			ResultSet rs;
			
			try {				
				rs = this.executeQuery(query, parametros, contexto.getConexionActual());

				if(rs.next()){
					
					Integer idCereal = rs.getInt("idCereal");
					Cereal cereal = this.cerealMapper.buscarPorId(idCereal);
					
					List<ItemSiembra> itemsSiembra = this.itemSiembraMapper.buscarPorIdSiembra(rs.getInt("id"));
					
					siembra = new Siembra(cereal, rs.getDate("fechaDesde"), rs.getDate("fechaHasta"));
					siembra.setDistribucionSiembra(itemsSiembra);
					this.logger.info("Mineral encontrado: " + siembra);			
				}			
			} catch (SQLException e) {
				this.logger.error("Error al buscar el cosecha. " + e.getMessage());
			}
		} catch (TransaccionException te) {
			this.logger.error("Error al buscar el cosecha. " + te.getMessage());
		} finally {
			contexto.liberarConexion();
		}
	
		return siembra;
	}

	@Override
	public boolean modificar(Siembra instancia) {
		
		this.logger.error("Voy a modificar el instancia: " + instancia);
		
		int resultado = 0;
		ContextoTransaccional contexto = null;
		
		try {
			contexto = super.administradorTransaccional.crearContexto(true);
			
			String query = "UPDATE  Siembra SET  idCereal = ? , fechaDesde  = ? , fechaHasta  = ? , cantidadSembrada  = ? WHERE id = ?";
			List<Object> parametros = new ArrayList<Object>();
			
			parametros.add(instancia.getCereal().getId());
			parametros.add(instancia.getFechaDesde());
			parametros.add(instancia.getFechaHasta());
			parametros.add(instancia.getCantidadSembrada());
			parametros.add(instancia.getId());
			
			try {			
				resultado = this.executeUpdate(query, parametros, contexto.getConexionActual());	
				
				List<ItemSiembra> siembras = instancia.getDistribucionSiembra();
				for (ItemSiembra itemSiembra : siembras) {
					this.itemSiembraMapper.guardar(itemSiembra);
				}
			} catch (SQLException e) {
				this.logger.error("Error al modificar el instancia. " + e.getMessage());
			}
		} catch (TransaccionException te) {
			this.logger.error("Error al buscar el instancia. " + te.getMessage());
		} finally {
			contexto.liberarConexion();
		}	
		
		return resultado > 0;	
	}

	@Override
	public boolean borrar(Siembra instancia) {
		
		this.logger.error("Borrando el mineral: " + instancia);
		
		int resultado = 0;
		ContextoTransaccional contexto = null;
		
		try {
			List<ItemSiembra> siembras = instancia.getDistribucionSiembra();
			for (ItemSiembra itemSiembra : siembras) {
				this.itemSiembraMapper.borrar(itemSiembra);
			}
			
			contexto = super.administradorTransaccional.crearContexto(true);
			
			String query = "Delete From Siembra WHERE id = ?";		
			List<Object> parametros = new ArrayList<Object>();
			
			parametros.add(instancia.getId());
			
			try {		
				resultado = this.executeUpdate(query, parametros, contexto.getConexionActual());
				
			} catch (SQLException e) {
				this.logger.error("Error al borrar el instancia. " + e.getMessage());
			}
		} catch (TransaccionException te) {
			this.logger.error("Error al buscar el instancia. " + te.getMessage());
		} finally {
			contexto.liberarConexion();
		}
	
		return resultado > 0;
	}

	@Override
	public List<Siembra> buscarTodos() {
		// TODO Auto-generated method stub
		return null;
	}

	public List<Siembra> buscarNoCosechados(Integer codigoCereal) {
		return null;
	}
	
	@Override
	public boolean guardarTodos(List<Siembra> instancia) {
		boolean a = false;
		
		for (Siembra siembra : instancia) {
			a = this.guardar(siembra);
		}
		
		return a;
	}
	
	private Integer obtenerUltimoId(){
		
		String sql = "select top 1 id from Siembra order by id desc";
		List<Object> parametros = new ArrayList<Object>();
		Integer resultado = null;
		ContextoTransaccional contexto = null;
		
		ResultSet rs;
		
		try {	
			contexto = super.administradorTransaccional.crearContexto(true);
			rs = this.executeQuery(sql, parametros, contexto.getConexionActual());

			if(rs.next()){
				
				resultado = rs.getInt("id");
				
			}
		}catch (Exception te) {
			this.logger.error("Error al buscar el instancia. " + te.getMessage());
		} finally {
			contexto.liberarConexion();
		}
		
		return resultado;
	}
}
